package main

import "fmt"

/*
切片的使用三种方式
1、定义一个切片，然后让切片去引用一个已经创建好的数组（上一节）
2、通过make来创建切片。
基本语法：
var 切片名 []type = make([]type,len,[cap])
参数说明：type：就是数据类型；len：大小；cap：指定切片容量，可选
3、定义一个切片，直接就指定具体数组，使用原理类似make的方式
*/
func main() {
	//定义的切片如果没有初始化，是不可以直接操作的
	//必须使用make
	/*
		总结：
		1、通过make方式创建切片可以指定切片的大小和容量
		2、如果没有给切片的各个元素赋值，那么就会使用默认值
		3、通过make方式创建的切片对应的数组是由make底层维护，对外不可见，即只能通过slice去访问各个元素
	*/
	var slice []float64 = make([]float64, 5, 10)
	slice[1] = 10
	slice[3] = 20
	slice[4] = 30
	fmt.Println(slice)
	fmt.Printf("%p\n", &slice)
	fmt.Println(&slice[4])

	//第三种方式
	var strSlice []string = []string{"tom", "jack", "mary"}
	fmt.Println("strSlice=", strSlice)
	fmt.Println("strSlice size=", len(strSlice))
	fmt.Println("strSlice cap=", cap(strSlice))
}

/*
方式1和方式2的区别
方式1是直接引用数组，这个数组是事先存在的，程序员是可见的
方式2是通过make来创建切片，make也会创建一个数组，是由切片在底层进行维护，程序员是看不见的
*/
